package com.zhouqinuan.spring.cloud.develop.framework.base.util;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.JLabel;

public class WatermarkUtil {

    /**
     * 图片加文字水印
     */
    public static BufferedImage addWatermark(String sourceImgPath, String waterMarkContent, String fileExt) throws Exception {
        Font font = new Font("思源黑体R", Font.PLAIN, 28);// 水印字体，大小
        Color markContentColor = Color.WHITE;// 水印颜色
        Integer degree = 45;// 设置水印文字的旋转角度
        float alpha = 0.75f;// 设置水印透明度
        BufferedImage bufferedImage = null;

        Image srcImg = ImageIO.read(new URL(sourceImgPath)); // 图片地址转图片
        int srcImgWidth = srcImg.getWidth(null);// 获取图片的宽
        int srcImgHeight = srcImg.getHeight(null);// 获取图片的高

        // 加水印
        bufferedImage = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
        Graphics2D graphics2d = bufferedImage.createGraphics();// 得到画笔
        graphics2d.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
        graphics2d.setColor(markContentColor); // 设置水印颜色
        graphics2d.setFont(font); // 设置字体
        graphics2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));// 设置水印文字透明度
        if (null != degree) {
            graphics2d.rotate(Math.toRadians(degree));// 设置水印旋转
        }

        JLabel label = new JLabel(waterMarkContent);
        FontMetrics metrics = label.getFontMetrics(font);
        int width = metrics.stringWidth(label.getText());// 文字水印的宽
        int rowsNumber = srcImgHeight / width + srcImgHeight % width;// 图片的高
                                                                     // 除以
                                                                     // 文字水印的宽
                                                                     // ——>
        // 打印的行数(以文字水印的宽为间隔)
        int columnsNumber = srcImgWidth / width + srcImgWidth % width;// 图片的宽
                                                                      // 除以
                                                                      // 文字水印的宽
                                                                      // ——>
        // 每行打印的列数(以文字水印的宽为间隔)
        // 防止图片太小而文字水印太长，所以至少打印一次
        if (rowsNumber < 1) {
            rowsNumber = 1;
        }
        if (columnsNumber < 1) {
            columnsNumber = 1;
        }

        for (int j = 0; j < rowsNumber; j++) {
            for (int i = 0; i < columnsNumber; i++) {
                graphics2d.drawString(waterMarkContent, (i * width + j * width) / 2, (-i * width + j * width) / 2 + 10);// 画出水印,并设置水印位置
            }
        }

        // 释放资源
        graphics2d.dispose();
        srcImg.getGraphics().dispose();

        return bufferedImage;
    }
}
